package reflect02;
/**
 * 反射(解剖出)成员方法信息
 * Class类中的成员方法:
 *  Method getMethod(String name, Class<?>... parameterTypes)
 *                  (方法名，形参列表) 因为重载的问题，需要方法名和形参列表才能准确确定一个方法
 *           返回一个 Method 对象，它反映此 Class 对象所表示的类或接口的指定公共成员方法。
 * Method类的方法:
 *  Object invoke(Object obj, Object... args)
 *        形参:
 *          Object obj:代表该类的一个对象
 *          args:代表传递给方法的实参
 *        返回值:
 *          代表调用的方法的返回值
 *          如果该方法没有返回值,那么invoke返回null
 */
import org.junit.Test;
import reflect01.Person;

import java.lang.reflect.Method;

public class ReflectDemo03 {
    @Test
    public void testMethod01() throws Exception{
        // 1.获取字节码对象
        Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");
        // 2.获取指定的成员方法
        Method sleepmethod = pCls.getMethod("sleep");
        // 因为sleep方法是空参的，所以不用传递参数

        // 3.通过invoke来调用方法
        Person p = pCls.newInstance();
        sleepmethod.invoke(p);// 类似：Person p = new Person()
                             // p.sleep()
        // 只有睡得好，精神才能好
    }








    @Test
    public void testMethod02() throws Exception {
        // 1.获取字节码对象
        Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");
        // 2.获取eat的成员方法
        Method eatmethod = pCls.getMethod("eat", String.class);
        // 因为eat方法需要传参数，而是还是String类

        // 3.通过invoke来调用方法
        Person p = pCls.newInstance();
        Object returnVal = eatmethod.invoke(p, "蛋糕");// 类似：Person p = new Person()
        System.out.println(returnVal);    // String food = p.eat("蛋糕")
                                       // sout.(food)
    }
}
